home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2000 September / september_2000.iso / intercd / root / ^Linux / Jooky / randmp3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-11-01  |  10.6 KB  |  460 lines

  1.  
  2. #include "defines.h"
  3. #include "includes.h"
  4. #include "funcs.h"
  5.  
  6. int main(argc, argv, envp)
  7.     int argc;
  8.     char **argv[];
  9.     char **envp[];
  10. {
  11.     extern char **environ;
  12.  
  13.     sockopt=1 ;
  14.     sockoptlen=sizeof(sockopt);
  15.     usepasswd=0 ;
  16.     titlequery=0 ;
  17.     envpsize=0 ;
  18.     pssize=0 ;
  19.     argy=0 ;
  20.     useclient=0 ;
  21.     i=0 ;
  22.     qq=0 ;
  23.     bl=0;
  24.     scramble=0 ;
  25.     quit=0 ;
  26.     todo=0 ;
  27.     dirhasbeenloaded=0 ;
  28.     playerselected=0 ;
  29.  
  30.     first=NULL ;
  31.     last=NULL ;
  32.     curr=NULL ;
  33.     count=0 ;
  34.     port=PORT ;
  35.     counterpid=0 ;
  36.     futabapid=0 ;
  37.     playerpid=0 ;
  38.     socketpid=0 ;
  39.     pidstatus=0 ;
  40.     daemonize=0 ;
  41.     daemonstat=0 ;
  42.     usefutaba=0 ;
  43.     usesocket=1 ;
  44.     playertouse=0 ;
  45.     clockout=calloc(1,256);
  46.     otestfn=calloc(1,256);
  47.     iam=calloc(1,256);
  48.     host=calloc(1,256);
  49.     password=calloc(1,80);
  50.     guess=calloc(1,80);
  51.  
  52.     strcpy(host,DEFAULTHOST);
  53.  
  54.     strcpy(iam,(char *)argv[0]);
  55.  
  56.     memset(&msgcountback[0],0,256);
  57.  
  58.     squig[0]='|';
  59.     squig[1]='/';
  60.     squig[2]='-';
  61.     squig[3]=92;
  62.  
  63.     for (qq=0;qq<=31;++qq)
  64.         actstr[qq]=calloc(1,10);
  65.  
  66.     strcpy(actstr[QUIT],"quit\n");
  67.     strcpy(actstr[PAUSE],"paus\n");
  68.     strcpy(actstr[RESUME],"resu\n");
  69.     strcpy(actstr[PREV],"prev\n");
  70.     strcpy(actstr[NEXT],"next\n");
  71.     strcpy(actstr[REPEAT],"repe\n");
  72.     strcpy(actstr[QUERY],"quer\n");
  73.  
  74.     for (qq=0;qq<=5;++qq)
  75.     {
  76.         mp3player[qq].player=calloc(1,80);
  77.         for (x=0;x<=10;++x) mp3player[qq].playerflags[x]=calloc(1,80);
  78.         mp3player[qq].playeroutput=calloc(1,80);
  79.     }
  80.  
  81.     strcpy(mp3player[0].player,"mpg123");
  82.     strcpy(mp3player[0].playerflags[0],"-q");
  83.     strcpy(mp3player[0].playerflags[1],"--aggressive");
  84.     strcpy(mp3player[0].playeroutput,"/dev/null");
  85.  
  86.     strcpy(mp3player[1].player,"mp3blaster");
  87.     strcpy(mp3player[1].playerflags[0],"-r=10");
  88.     strcpy(mp3player[1].playeroutput,"/dev/tty11");
  89.  
  90.     strcpy(mp3player[2].player,"freeamp");
  91.     strcpy(mp3player[2].playerflags[0],"-q");
  92.     strcpy(mp3player[2].playeroutput,"/dev/null");
  93.  
  94.     argstart=(char *)argv[0];
  95.  
  96.     nice(-5);
  97.  
  98.         for (i = 0; envp[i] != NULL; i++)
  99.                 envpsize += strlen((char *)envp[i]) + 1;
  100.         environ = (char **) malloc(sizeof (char *) * (i + 1));
  101.         for (i = 0; envp[i] != NULL; i++)
  102.                 environ[i] = strcpy((char *)calloc(1,strlen((char *)envp[i]) + 1), (char *)envp[i]);
  103.         environ[i] = NULL;
  104.  
  105.  
  106.         for (qq = 0; qq < argc; qq++)
  107.         {
  108.                 if (qq==0 || ((char *)(lastargv + 1) == (char *)argv[qq]))
  109.         {
  110.             lastargv = (char *)argv[qq];
  111.             lastargv = (char *)(lastargv + strlen((char *)argv[qq]));
  112.         }
  113.                 else
  114.                         continue;
  115.         }
  116.  
  117.     for (qq = 0; envp[qq] != NULL; qq++)
  118.     {
  119.         if (qq==0 || (lastargv+1 == (char *)envp[qq]))
  120.         {
  121.             lastargv = (char *)envp[qq];
  122.             lastargv = lastargv + strlen((char *)envp[qq]);
  123.         }
  124.         else
  125.             continue;
  126.     }
  127.  
  128.     pssize=(int)((long int)lastargv - (long int)argv[0]);
  129.  
  130.     mp3directory=calloc(1,256);
  131.  
  132.     strcpy(mp3directory,MP3DIRECTORY);
  133.     do
  134.     {
  135.         argy = getopt(argc,(char **)argv,"QqpcnbrTdzfm:h?w:i:t:P:");
  136.         switch (argy)
  137.         {
  138.             case 'Q': if (daemonize==0) {
  139.                     daemonize=2;
  140.                     break;
  141.                 } else {
  142.                     printf ("Can't specify -d with -Q.\n");
  143.                     exit(1);
  144.                 }
  145.                 /* daemonize=2 doesn't daemonize */
  146.                 /* it just keeps it quiet */
  147.             case 'q': todo=QUIT;   break;
  148.             case 'p': todo=PAUSE;  break;
  149.             case 'c': todo=RESUME; break;
  150.             case 'n': todo=NEXT;   break;
  151.             case 'b': todo=PREV;   break;
  152.             case 'r': todo=REPEAT; break;
  153.             case 'T': todo=QUERY;  break;
  154.             case 'd': if (daemonize==0) {
  155.                     daemonize=1;
  156.                     break;
  157.                 } else {
  158.                     printf ("Can't specify -d with -Q.\n");
  159.                     exit(1);
  160.                 }
  161.             case 'z': scramble=1;  break; /* no repeats */
  162.             case 'f': usefutaba=1; break;
  163.             case 'm': playertouse=atoi(optarg);
  164.                   break;
  165.             case 'h': help();          exit(0);
  166.             case '?': help();          exit(0);
  167.             case 'w': strcpy(mp3directory,optarg); break;
  168.             case 'i': strcpy(host,optarg);useclient=1; break;
  169.             case 't': port=atoi(optarg); break;
  170.             case 'P': strcpy(password,optarg);usepasswd=1; break;
  171.     
  172.             default: ;
  173.         }
  174.     } while (argy != EOF);
  175.  
  176.     memset(argv[0],0,pssize);
  177.     if (usesocket==1)
  178.     sprintf((char *)argv[0],(char *)"Jooky! ver. %s (c) 1999 by Dentar, Inc. (listening on port %d)",VERSION,port);
  179.     else
  180.     sprintf((char *)argv[0],(char *)"Jooky! ver. %s (c) 1999 by Dentar, Inc.",VERSION);
  181.  
  182.     if (findplayers()==(char *)NULL) exit (1);
  183.  
  184.     if (todo != 0)
  185.     {
  186.         jookyclient(host,actstr[todo]);
  187.     }
  188.  
  189.     if (daemonize==1)
  190.     {
  191.         daemonstat=fork();
  192.         if (daemonstat>0) 
  193.         {
  194.             printf ("Daemonized!\n");
  195.             exit(0);
  196.         }
  197.  
  198.         if (daemonstat<0)
  199.         {
  200.             printf ("Can't daemonize!\n");
  201.             exit(-1);
  202.         }
  203.  
  204.         if (daemonstat==0)
  205.         {
  206.             memset(argv[0],0,pssize);
  207.             if (usesocket==0)
  208.             sprintf((char *)argv[0],(char *)"Jookyd! ver. %s (c) 1999 by Dentar, Inc.",VERSION);
  209.             else
  210.             sprintf((char *)argv[0],(char *)"Jookyd! ver. %s (c) 1999 by Dentar, Inc. (listening on port %d)",VERSION,port);
  211.             argv[1]=NULL;
  212.         }
  213.     }
  214.  
  215.     if (createlockfile()!=0)
  216.     {
  217.         fprintf(stdout,"Already running!\n");
  218.         exit(-1);
  219.     }
  220.  
  221.     if (loaddir()!=0) exit (-1);
  222.  
  223.     setuphandlers();
  224.  
  225.     if (daemonize==0)
  226.     {
  227.         initscr();
  228.         halfdelay(1);
  229.         noecho();
  230.         oldcurs=curs_set(0);
  231.     }
  232.     else
  233.     {
  234.         freopen("/dev/null","a+",stdin);
  235.         freopen("/dev/null","a+",stdout);
  236.         freopen("/dev/null","a+",stderr);
  237.     }
  238.  
  239.     
  240.     if (usesocket==1)
  241.     {
  242.         fd=socket(AF_INET,SOCK_STREAM,0);
  243.     
  244.         sokitin.sin_family = AF_INET;
  245.         sokitin.sin_port = htons(port);
  246.         sokitin.sin_addr.s_addr=INADDR_ANY;
  247.         memset(&sokitin.sin_zero,0,8);
  248.  
  249.         if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&sockopt,sockoptlen)!=0) {
  250.             jookyerr=fopen("/tmp/jooky.err","w+");
  251.             fprintf(jookyerr,"setsockopt: %s\n",strerror(errno));
  252.             fclose(jookyerr);
  253.             removelockfile();
  254.             exit(errno);
  255.         }
  256.     
  257.         if (bind(fd,(struct sockaddr *)&sokitin,sizeof(struct sockaddr)) == -1)
  258.         {
  259.             jookyerr=fopen("/tmp/jooky.err","w+");
  260.             fprintf(jookyerr,"bind: %s\n",strerror(errno));
  261.             fclose(jookyerr);
  262.             fprintf(stderr,"bind: %s\n",strerror(errno));
  263.             usesocket=0;
  264.             removelockfile();
  265.             exit(errno);
  266.         }
  267.     
  268.         if (listen(fd,bl)==-1)
  269.         {
  270.             jookyerr=fopen("/tmp/jooky.err","w+");
  271.             fprintf(jookyerr,"listen: %s\n",strerror(errno));
  272.             fclose(jookyerr);
  273.             usesocket=0;
  274.         }
  275.     }
  276.  
  277.     if (usesocket==1) fcntl(fd,F_SETFL,O_NONBLOCK);
  278.     
  279.     for (;;)  /* do this til the end of time */
  280.     {
  281.         curr=curr->next ;
  282.         if (daemonize==0)
  283.         {
  284.             move(DIRLINE,0);
  285.             clrtoeol();
  286.             mvaddnstr(DIRLINE,\
  287.                 (strlen(mp3directory) < COLS) ? \
  288.                 (COLS-strlen(mp3directory))/2 : 0 ,\
  289.                 mp3directory,COLS);
  290.             move(TITLELINE,0);
  291.             clrtoeol();
  292.             mvaddnstr(TITLELINE,\
  293.                 (strlen(curr->fname) < COLS) ? \
  294.                 (COLS-strlen(curr->fname))/2 : 0 ,\
  295.                 curr->fname,COLS);
  296.             move(LINES-1,0);
  297.             clrtoeol();
  298.             standout();
  299.             mvprintw(LINES-2,(COLS/2)-(strlen(HEP)/2),HEP);
  300.             mvprintw(LINES-1,(COLS/2)-(strlen(HEP2)/2),HEP2);
  301.             standend();
  302.             dument=curr;
  303.             for (qq=(LINES-STATUSLINE-4)/2;qq>0;--qq) dument=dument->prev;
  304.             for (qq=STATUSLINE+1;qq<=LINES-4;++qq)
  305.             {
  306.                 move(qq,0);
  307.                 clrtoeol();
  308.                 if (dument==curr)
  309.                 {
  310.                     standout();
  311.                     mvaddnstr(qq,\
  312.                     (strlen(dument->fname) < COLS) ? \
  313.                     (COLS-strlen(dument->fname))/2 : 0 ,\
  314.                     dument->fname,COLS);
  315.                     standend();
  316.                 } else
  317.                     mvaddnstr(qq,\
  318.                     (strlen(dument->fname) < COLS) ? \
  319.                     (COLS-strlen(dument->fname))/2 : 0 ,\
  320.                     dument->fname,COLS);
  321.                 
  322.                 dument=dument->next;
  323.             }
  324.             refresh();
  325.         }
  326.         memset(otestfn,0,256);
  327.         strcat(otestfn,mp3directory);
  328.         strcat(otestfn,"/");
  329.         strcat(otestfn,curr->fname);
  330.         if ((otest=fopen(otestfn,"r"))!=(FILE *)NULL)
  331.         {
  332.             fclose(otest);
  333.  
  334.             playerpid=fork();
  335.             if (playerpid==0)
  336.             {
  337.                 memset(argv[0],0,pssize);
  338.                 sprintf((char *)argv[0],"jookyplayerd [%s] [%s]",mp3directory,curr->fname);
  339.                 argv[1]=NULL;
  340.                 startplayer(mp3directory,curr->fname);
  341.                 removelockfile();
  342.                 exit(0);
  343.             } else if (playerpid < 0)
  344.             {
  345.                 perror ("Fork player in main failed");
  346.                 removelockfile();
  347.                 exit(-1);
  348.             } else if (playerpid > 0)
  349.             {
  350.                 if (counterpid!=0) kill(counterpid,SIGKILL);
  351.                 if (futabapid!=0) kill(futabapid,SIGKILL);
  352.     
  353.                 if (daemonize==0)
  354.                 {
  355.                     if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets)<0)    
  356.                     {
  357.                         perror ("Socketpair:");
  358.                         removelockfile();
  359.                         close(sockets[0]);
  360.                         close(sockets[1]);
  361.                         exit(1);
  362.                     } else
  363.                         fcntl(sockets[0],F_SETFL,O_NONBLOCK);
  364.                     counterpid=fork();
  365.                     if (counterpid==0)
  366.                     {
  367.                         memset(argv[0],0,pssize);
  368.                         sprintf((char *)argv[0],"counterd [%d]",mp3hed(mp3directory,curr->fname));
  369. /*                        strcpy((char *)argv[0],"counterd"); */
  370.                         argv[1]=NULL;
  371.                         argc=0;
  372.                         revcounter(mp3hed(mp3directory,curr->fname));
  373.                         exit(0);
  374.                     };
  375.                 };
  376.  
  377.                 if (usefutaba==1)
  378.                 {
  379.                     futabapid=fork();
  380.                     if (futabapid==0)
  381.                     {
  382.                         memset(argv[0],0,pssize);
  383.                         sprintf((char *)argv[0],"futabad [%s] [%d]",curr->fname,mp3hed(mp3directory,curr->fname));
  384.                         argv[1]=NULL;
  385.                         futaba(curr->fname,mp3hed(mp3directory,curr->fname));
  386.                         exit(0);
  387.                     }
  388.                 }
  389.  
  390.                 while (waitpid(playerpid,&pidstatus,WNOHANG)==0)
  391.                 {
  392.                     if (daemonize==0)
  393.                     {
  394.                         if (read(sockets[0],clockout,1024)!=-1)
  395.                         {
  396.                             move(TIMELINE,0);
  397.                             clrtoeol();
  398.                             mvaddstr(TIMELINE,(COLS-strlen(clockout))/2,clockout);
  399.                             memset(clockout,0,256);
  400.                         }
  401.                         key=getch();
  402.                         squiggly();
  403.                         if (key=='p') pauseplay();
  404.                         if (key=='c') resumeplay();
  405.                         if (key=='r') skipbackward();
  406.                         if ((key=='n')||(key=='j')) skipforward();
  407.                         if ((key=='N')||(key=='J'))
  408.                         {
  409.                             for (qq=1;qq<((LINES-STATUSLINE-5)/2);++qq)
  410.                             {
  411.                                 curr=curr->next;
  412.                             }
  413.                             skipforward();
  414.                         }
  415.                         if ((key=='b')||(key=='k'))
  416.                         {
  417.                             skipbackward();
  418.                             skipbackward();
  419.                         }
  420.                         if ((key=='B')||(key=='K'))
  421.                         {
  422.                             for (qq=0;qq<((LINES-STATUSLINE-2)/2);++qq)
  423.                                 skipbackward();
  424.                         }
  425.                         if (key=='q') removelockfile();
  426.                         for (qq=9;qq>=0;--qq)
  427.                         {
  428.                             if (msgcountback[qq]==1)
  429.                             {
  430.                                 move(qq,0);
  431.                                 clrtoeol();
  432.                                 refresh();
  433.                             }
  434.                             if (msgcountback[qq]>0) --msgcountback[qq];
  435. /*                            mvprintw(qq+9,0,"%d",msgcountback[qq]); */
  436.                         }
  437.                         refresh();
  438.                     } else sleep(1);
  439.                     if (usesocket==1)
  440.                         jookysock(mp3directory,curr->fname);
  441.                 }
  442.                 if ((daemonize==0)&&(usefutaba==0))
  443.                 {
  444.                     close(sockets[0]);
  445.                     close(sockets[1]);
  446.                 }
  447.                 playerpid=0;
  448.             }    
  449.         } else
  450.         {
  451.             mvprintw(STATUSLINE,0,"Can't open %s!",curr->fname);
  452.             clrtoeol();
  453.             refresh();
  454.             usleep(300000);
  455.             if (getch()=='q')
  456.                 removelockfile();
  457.         }
  458.     }
  459. }
  460.